#include <string.h>
#include <iostream>

using std::cout;
using std::endl;

int arr[10] = {1, 2, 3, 5, 7, 9};
void func()
{
arr[10] = 10;
}
/* arr.operator[](size_t idx) */

class CharArray
{
public:
    CharArray(size_t sz = 10)
    : _size(sz)
    , _data(new char[_size]())
    {

    }

    //引用符号什么时候需要加上？
    //1、如果函数的返回值的生命周期比函数的生命周期大的时候，
    //为了避免在执行return语句的时候多执行一次拷贝操作，所以
    //尽量使用引用
    //
    //2、在流中，是可以无限传递参数执行下去，这个时候用引用
    //可以减少多次拷贝，提高程序的执行效率
    //
    //3、在赋值运算符函数的返回类型的时候，也是返回的引用，
    //因为连等的时候，可以少执行拷贝操作，也可以提高程序的
    //执行效率
    //
    //特征：下标访问运算符的重载可以让程序更加安全点
    char &operator[](size_t idx)//size_t是无符号
    {
        /* cout << "char &operator[](size_t)" << endl; */
        /* { */
        /* int a = 10; //缩短变量的生命周期*/
        /* } */
        /* const int &ref = 10; */
        if(idx < _size)
        {
            return _data[idx];
        }
        else
        {
            static char nullchar = '\0';
            return nullchar;
        }
    }

    size_t size() const
    {
        return _size;
    }

    ~CharArray()
    {
        if(_data)
        {
            delete [] _data;
            _data = nullptr;
        }
    }

private:
    size_t _size;//
    char *_data;
};


int main(int argc, char **argv)
{
    const char *pstr = "helloworld";
    CharArray ca(strlen(pstr) + 1);

    for(size_t idx = 0; idx != ca.size(); ++idx)
    {
        /* ca[idx] = pstr[idx];//简写 */
        ca.operator[](idx) = pstr[idx];//原型
    }

    for(size_t idx = 0; idx != ca.size(); ++idx)
    {
        /* cout << ca[idx] << " "; */
        cout << ca.operator[](idx) << " ";
    }
    cout << endl;

    return 0;
}

